﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Service.Validation.BusinessRules;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic.BusinessRuleValidation
{
    /// <summary>
    /// Validacao
    /// </summary>
    public class ValidacaoNegocioFaixaCorretagem : BaseBusinessRuleValidation<BusinessEntity.FaixaCorretagem>, IBusinessRuleValidation
    {
        #region Campos
        private int _erroValorInferiorPrimeiraFaixaDiferenteZero = 109469;
        private int _erroValorInferiorFaixaAnteriorMaiorQueAtual = 109470;
        private int _erroConflitoVigencias = 109471;
        private int _erroNumeroFaixaZero = 109472;
        private int _erroObjetoNulo = 109468;
        private int _erroValorSuperiorMenorValorInferior = 109546;

        
        #endregion

        #region Propriedades
        /// <summary>
        /// ErroValorInferiorPrimeiraFaixaDiferenteZero
        /// </summary>
        public int ErroValorInferiorPrimeiraFaixaDiferenteZero
        {
            get { return _erroValorInferiorPrimeiraFaixaDiferenteZero; }
            set { _erroValorInferiorPrimeiraFaixaDiferenteZero = value; }
        }
        /// <summary>
        /// ErroValorInferiorFaixaAnteriorMaiorQueAtual
        /// </summary>
        public int ErroValorInferiorFaixaAnteriorMaiorQueAtual
        {
            get { return _erroValorInferiorFaixaAnteriorMaiorQueAtual; }
            set { _erroValorInferiorFaixaAnteriorMaiorQueAtual = value; }
        }
        /// <summary>
        /// ErroConflitoVigencias
        /// </summary>
        public int ErroConflitoVigencias
        {
            get { return _erroConflitoVigencias; }
            set { _erroConflitoVigencias = value; }
        }
        /// <summary>
        /// ErroNumeroFaixaZero
        /// </summary>
        public int ErroNumeroFaixaZero
        {
            get { return _erroNumeroFaixaZero; }
            set { _erroNumeroFaixaZero = value; }
        }
        /// <summary>
        /// ErroObjetoNulo
        /// </summary>
        public int ErroObjetoNulo
        {
            get { return _erroObjetoNulo; }
            set { _erroObjetoNulo = value; }
        }

        /// <summary>
        /// Código da exceção para o valor superior menor que o valor inferior
        /// </summary>
        public int ErroValorSuperiorMenorValorInferior
        {
            get { return _erroValorSuperiorMenorValorInferior; }
            set { _erroValorSuperiorMenorValorInferior = value; }
        }

        #endregion

        #region IBusinessRuleValidation Members

        /// <summary>
        /// Retorna a lista de erros
        /// </summary>
        /// <returns></returns>
        public List<Sinacor.Infra.Common.Validation.ValidationError> GetErrors()
        {
            return base.ErrorsList;
        }

        /// <summary>
        /// Validação
        /// </summary>
        public void Validate()
        {
            

            if( base.EntityToValidate != null){
              
              this.ValidarNumeroFaixaZero();
              this.ValidarValorSuperiorMenorValorInferior();
              this.ValidarValorInferiorPrimeiraFaixa();
              this.ValidarValorInferiorFaixaAnteriorComAtual();
              this.VerificarConflitoVigencias();

            }
            else
              base.AddValidationError( ErroObjetoNulo );

        }

        #endregion

        #region Métodos Internos
        /// <summary>
        /// Validacao
        /// </summary>
        private void ValidarValorInferiorPrimeiraFaixa() 
        {
            if (base.EntityToValidate.NumeroFaixa == 1 && base.EntityToValidate.ValorInferior != 0)
                base.AddValidationError(this.ErroValorInferiorPrimeiraFaixaDiferenteZero);
        }

        /// <summary>
        /// Validar Valor Superior Menor que Valor Inferior
        /// </summary>
        private void ValidarValorSuperiorMenorValorInferior() 
        {
            
            if (EntityToValidate.ValorSuperior < EntityToValidate.ValorInferior)
                base.AddValidationError(this.ErroValorSuperiorMenorValorInferior);
        }
        /// <summary>
        /// Validacao
        /// </summary>
        private void ValidarValorInferiorFaixaAnteriorComAtual() 
        {
            if( base.EntityToValidate.NumeroFaixa > 1)
            {
                BusinessEntity.Parameter.FiltroFaixaCorretagemChave filtroFaixaAnterior = new BusinessEntity.Parameter.FiltroFaixaCorretagemChave();

                filtroFaixaAnterior.DataInicial = base.EntityToValidate.DataInicial;
                filtroFaixaAnterior.NumeroFaixa = base.EntityToValidate.NumeroFaixa;

                BusinessEntity.FaixaCorretagem faixaAnterior = new ResourceAccess.FaixaCorretagem().ObterFaixaCorretagemAnterior(filtroFaixaAnterior);

                if(faixaAnterior != null && faixaAnterior.ValorSuperior > base.EntityToValidate.ValorInferior)
                    base.AddValidationError( this.ErroValorInferiorFaixaAnteriorMaiorQueAtual );
            }
        }
        /// <summary>
        /// Validacao
        /// </summary>
        private void VerificarConflitoVigencias() 
        {

            BusinessEntity.Periodo periodo = new BusinessEntity.Periodo();
            periodo.DataInicial = base.EntityToValidate.DataInicial;
            periodo.DataFinal = base.EntityToValidate.DataFinal;

            int qtdeConflitos = new ResourceAccess.FaixaCorretagem().ObterQtdeFaixasConflitoVigencia(periodo);


            if(qtdeConflitos > 0)
              base.AddValidationError( ErroConflitoVigencias );

        }
        /// <summary>
        /// Validacao
        /// </summary>
        private void ValidarNumeroFaixaZero() 
        {

            if( base.EntityToValidate.NumeroFaixa == 0)
              base.AddValidationError( ErroNumeroFaixaZero );
        }
        #endregion
    }
}
